package com.gxuwz.prrs.utils;

import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import com.gxuwz.prrs.R;
import com.gxuwz.prrs.adapter.UpdatableAbstractAdapter;
import com.gxuwz.prrs.bean.Page;
import com.gxuwz.prrs.service.BaseService;
import com.gxuwz.prrs.service.ServiceHolder;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 张钧
 * @Description
 * @create 2023-05-24 下午 08:22
 */
public class PageUtils {

	/**
	 * 获取分页导航列表
	 * 1.页面足够遍历，所以第六个元素为0
	 * 2.页面不够
	 * 2.1起始页为1需要向右添加，则第六元素为添加的数量
	 * 2.2起始页不是1，需要向左添加
	 * 2.2.1足够五个元素，第六元素为0
	 * 2.2.2添加到了1，还是不足五个元素，则再次向右添加，并且第六个元素为向右添加的数量，在添加第六元素前先排序
	 * @param page 分页对象
	 * @return 分页导航列表 一共六个元素，前五个为按钮的页码，第六个为从右向左禁用几个按钮
	 */
	public static <T> List<Long> getPageNavigationList(Page<T> page) {
		List<Long> elements = new ArrayList<>();
		long current = page.getCurrent();
		long total = page.getTotal();
		long size = page.getSize();
		long pageCount = total / size;
		if (total % size > 0) {
			pageCount++;
		}
		/*
		 起始页为目标页减2和1中最大的值
		 若目标页为3以下的则是1
		 若目标页为3以上的则是目标页-2
		 */
		long startPage = Math.max(current - 2, 1);
		/*
		 结束页为目标页加2和总页数取最小值
		 若目标页加2大于了总页数则取总页数
		 小于则取目标页加2
		 */
		long endPage = Math.min(current + 2, pageCount);
		/*
		如果结束页减去起始页小于四，也就是说不足五页
		则尝试向左扩容
		 */
		if (endPage - startPage < 4) {
			startPage = Math.max(endPage - 4, 1);
		}
		/*
		开始填充页码
		 */
		for (long i = startPage; i <= endPage; i++) {
			elements.add(i);
		}
		/*
		如果列表里已经有了五个元素则直接添加第六元素0然后返回
		不然就右扩容并且将第六元素设置为扩容的数量
		 */
		if(elements.size() == 5){
			elements.add(0L);
		}else {
			long start = endPage + 1;
			long count = 0;
			while (elements.size() != 5){
				elements.add(start);
				if(start > pageCount){
					count++;
				}
				start++;
			}
			elements.add(count);
		}
		return elements;
	}

	/**
	 * 更新页面数据和导航按钮状态
	 *
	 * @param result     分页数据
	 * @param activity   当前Activity
	 * @param buttonList 导航按钮列表
	 * @param left       左箭头ImageView
	 * @param right      右箭头ImageView
	 * @param current    当前页码
	 * @return 分页数据列表
	 */
	public static <T> List<T> updatePageDataAndNavigation(Page<T> result, AppCompatActivity activity, List<Button> buttonList, ImageView left, ImageView right, long current) {
		if (result != null) {
			TextView total = activity.findViewById(R.id.total);
			long resultTotal = result.getTotal();
			total.setText(String.valueOf(resultTotal));
			List<Long> buttonTextList = PageUtils.getPageNavigationList(result);
			//将所有按钮启用，并且将当前页按钮禁用
			for (int i = 0; i < buttonList.size(); i++) {
				Long buttonText = buttonTextList.get(i);
				Button button = buttonList.get(i);
				button.setText(String.valueOf(buttonText));
				button.setTextColor(ContextCompat.getColor(activity, R.color.black));
				button.setClickable(true);
				button.setEnabled(true);
				if (buttonText.equals(result.getCurrent())) {
					button.setTextColor(ContextCompat.getColor(activity, R.color.blue));
					button.setClickable(false);
					button.setEnabled(false);
				}
			}
			//将第六元素取出
			int n = Math.toIntExact(buttonTextList.get(5));
			//将按钮的最后几个元素取出，若为0则为空集合
			List<Button> subList = buttonList.subList(buttonList.size() - n, buttonList.size());
			//遍历集合，若是有元素则将其禁用点击
			for (Button button : subList) {
				button.setTextColor(ContextCompat.getColor(activity, R.color.purple_200));
				button.setClickable(false);
				button.setEnabled(false);
			}
			//将左设置为可点
			left.setClickable(true);
			left.setEnabled(true);
			left.setVisibility(View.VISIBLE);
			//若当前页为1则设置不可点
			if (current == 1) {
				left.setVisibility(View.INVISIBLE);
				left.setClickable(false);
				left.setEnabled(false);
			}
			long size = result.getSize();
			long pageCount = resultTotal / size;
			if (resultTotal % size > 0) {
				pageCount++;
			}
			//将右设置为可点
			right.setClickable(true);
			right.setEnabled(true);
			right.setVisibility(View.VISIBLE);
			//若当前页为最大页码则设置不可点
			if (current == pageCount) {
				right.setVisibility(View.INVISIBLE);
				right.setClickable(false);
				right.setEnabled(false);
			}
			return result.getRecords();
		}
		return null;
	}

	/**
	 * 设置页面按钮的点击事件监听器和相关配置。
	 *
	 * @param activity    当前活动的 AppCompatActivity 对象
	 * @param buttonList  存储页面按钮的列表
	 * @param listener    按钮点击事件的监听器
	 */
	public static void setupPageButtons(AppCompatActivity activity, List<Button> buttonList, View.OnClickListener listener) {
		Button button1 = activity.findViewById(R.id.button_1);
		Button button2 = activity.findViewById(R.id.button_2);
		Button button3 = activity.findViewById(R.id.button_3);
		Button button4 = activity.findViewById(R.id.button_4);
		Button button5 = activity.findViewById(R.id.button_5);
		buttonList.add(button1);
		buttonList.add(button2);
		buttonList.add(button3);
		buttonList.add(button4);
		buttonList.add(button5);
		button1.setOnClickListener(listener);
		button2.setOnClickListener(listener);
		button3.setOnClickListener(listener);
		button4.setOnClickListener(listener);
		button5.setOnClickListener(listener);
	}

	/**
	 * 设置页面的左右导航按钮点击事件监听器
	 *
	 * @param activity    当前活动的 AppCompatActivity 实例
	 * @param buttonList  按钮列表
	 * @param left        左导航按钮的 ImageView
	 * @param right       右导航按钮的 ImageView
	 * @param current     当前页码
	 * @param adapter     数据适配器
	 * @param vClass      数据服务类的 Class 对象
	 * @param p           页面对象
	 */
	public static <T, P extends Page<T>> void setupNavigationButtons(AppCompatActivity activity, List<Button> buttonList, ImageView left, ImageView right, long current, UpdatableAbstractAdapter<T> adapter, Class<? extends BaseService<T, P>> vClass, P p) {
		left.setOnClickListener(imageViewOnClick(activity, adapter, current - 1, vClass, p, buttonList, left, right));
		right.setOnClickListener(imageViewOnClick(activity, adapter, current + 1, vClass, p, buttonList, left, right));
	}


	/**
	 * 加载分页数据
	 *
	 * @param activity   当前Activity
	 * @param current    当前页码
	 * @param adapter     数据适配器
	 * @param vClass     BaseService的子类类型
	 * @param p          Page对象或其子类对象
	 * @param buttonList 导航按钮列表
	 * @param left       左箭头ImageView
	 * @param right      右箭头ImageView
	 * @return 分页数据列表
	 */
	public static <T, P extends Page<T>> List<T> loadPage(AppCompatActivity activity, long current, UpdatableAbstractAdapter<T> adapter, Class<? extends BaseService<T, P>> vClass, P p, List<Button> buttonList, ImageView left, ImageView right) {
		p.setCurrent(current);
		BaseService<T, P> service = ServiceHolder.getInstance().getBean(vClass);
		Page<T> result = service.page(p);
		setupNavigationButtons(activity, buttonList,left,right,current, adapter, vClass,p);
		return updatePageDataAndNavigation(result, activity, buttonList, left, right, current);
	}

	/**
	 * 左右键点击事件监听器
	 *
	 * @param activity         当前Activity
	 * @param updatableAbstractAdapter 数据适配器
	 * @param current          当前页码
	 * @param vClass           BaseService的子类类型
	 * @param p                Page对象或其子类对象
	 * @param buttonList       导航按钮列表
	 * @param left             左箭头ImageView
	 * @param right            右箭头ImageView
	 * @return ImageView点击事件监听器
	 */
	private static <T, P extends Page<T>> View.OnClickListener imageViewOnClick(AppCompatActivity activity, UpdatableAbstractAdapter<T> updatableAbstractAdapter, long current, Class<? extends BaseService<T, P>> vClass, P p, List<Button> buttonList, ImageView left, ImageView right) {
		return a -> {
			updatableAbstractAdapter.updateData(loadPage(activity, current, updatableAbstractAdapter, vClass, p, buttonList, left, right));
		};
	}

}
